package sessions;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entities.PropostaAbilita;
import entities.RichiestaAmicizia;
import entities.Utente;


@Stateless
public class RichiestaAmiciziaManager implements RichiestaAmiciziaManagerRemote, RichiestaAmiciziaManagerLocal{
	@PersistenceContext(unitName = "SwimDB")
	EntityManager database;


	@Override
	public boolean inserisciRichiestaAmicizia(Utente mittente,
			Utente destinatario, String commento) {

		Date d=new Date();
		try {
			RichiestaAmicizia richiesta=new RichiestaAmicizia();
			richiesta.setDescrizione(commento);
			richiesta.setMittente(mittente);
			richiesta.setDestinatario(destinatario);
			richiesta.setResponso("NonValutata");

			richiesta.setData(d);


			database.persist(richiesta);
			return true;
		}

		catch (EntityNotFoundException exc) { 
		} catch (NonUniqueResultException exc) {
			return false;
		}
		return false;
	}

	public boolean richiestaGiaEffettuata(Utente mittente, Utente destinatario) {
		try {
			Query q = database.createQuery("FROM RichiestaAmicizia r where r.mittente=?1 and r.destinatario=?2");
			q.setParameter(1, mittente);
			q.setParameter(2, destinatario);
			List<?> risultato =  q.getResultList();

			if(!risultato.isEmpty())
			{
				return true;
			}

			q = database.createQuery("FROM RichiestaAmicizia r where r.mittente=?1 and r.destinatario=?2");
			q.setParameter(1, destinatario);
			q.setParameter(2, mittente);
			risultato =  q.getResultList();
			if(!risultato.isEmpty())
			{
				return true;
			}

			return false;

		}

		catch (EntityNotFoundException exc) { 
		} catch (NonUniqueResultException exc) {
			return true;
		}
		return true;

	}

	public boolean sonoGiaAmici(Utente mittente, Utente destinatario) {
		try {
			Query q = database.createQuery("FROM Amicizia a where a.mittente=?1 and a.destinatario=?2");
			q.setParameter(1, mittente);
			q.setParameter(2, destinatario);
			List<?> risultato =  q.getResultList();
			if(!risultato.isEmpty())
			{
				return true;
			}

			q = database.createQuery("FROM Amicizia a where a.mittente=?1 and a.destinatario=?2");
			q.setParameter(1, destinatario);
			q.setParameter(2, mittente);
			risultato =  q.getResultList();
			if(!risultato.isEmpty())
			{
				return true;
			}

			return false;

		}

		catch (EntityNotFoundException exc) { 
		} catch (NonUniqueResultException exc) {
			return true;
		}
		return true;

	}

	@Override
	public List<RichiestaAmicizia> getRichiesteDaUtenteRicevute(Utente destinatario) {

		List<RichiestaAmicizia> richieste=new ArrayList<RichiestaAmicizia>();
		try {
			Query q = database.createQuery("FROM RichiestaAmicizia r where r.destinatario=?1");
			q.setParameter(1, destinatario);
			List<?> risultato =  q.getResultList();

		
			for(Object obj: risultato) {
				richieste.add((RichiestaAmicizia) obj);
			}
			return richieste;

		}

		catch (EntityNotFoundException exc) { 
		} {
			return null;
		}
	}

	@Override
	public RichiestaAmicizia getRichiestaAmicizia(Utente mittente,
			Utente destinatario) {

		try {
			Query q = database.createQuery("FROM RichiestaAmicizia r where r.mittente=?1 and r.destinatario=?2");
			q.setParameter(1, mittente);
			q.setParameter(2, destinatario);
			return (RichiestaAmicizia) q.getSingleResult();
		
		

		}

		catch (EntityNotFoundException exc) { 
		} {
			return null;
		}
	}

	@Override
	public void rifiutaRichiesta(String mittente, String destinatario) {
		
		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099");
		InitialContext jndiContext;
		try {
			jndiContext = new InitialContext(env);
		
		Object ref = jndiContext.lookup("UserManager/local");
		UserManagerLocal u = (UserManagerLocal) ref;
		
		RichiestaAmicizia r=getRichiestaAmicizia(u.getUserWithUsername(mittente), u.getUserWithUsername(destinatario));
		r.setResponso("rifiutata");
		
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public List<RichiestaAmicizia> getRichiesteDaUtenteInviate(Utente mittente) {
		List<RichiestaAmicizia> richieste=new ArrayList<RichiestaAmicizia>();
		try {
			Query q = database.createQuery("FROM RichiestaAmicizia r where r.mittente=?1");
			q.setParameter(1, mittente);
			List<?> risultato =  q.getResultList();

		
			for(Object obj: risultato) {
				richieste.add((RichiestaAmicizia) obj);
			}
			return richieste;

		}

		catch (EntityNotFoundException exc) { 
		} {
			return null;
		}
	}

	@Override
	public void eliminaRichiesta(long id) {
		RichiestaAmicizia ric=database.find(RichiestaAmicizia.class, id);
		database.remove(ric);
		
	}

}

